"""
用例ID: TC_login_001
用例标题: 验证输入未注册的用户可以登录系统
预制条件:
    1. 在系统中 未注册用户名为:junfu 密码为:123456 的用户并且要注册的邮箱不重复
    2. 打开谷歌浏览器,进入ecshop的登录页面
用例步骤:
    1. 输入用户名 : junfu
    2. 输入email : 123@qq.com
    3. 输入密码 : 123456
    4. 输入确认密码 : 123456
    5. 输入手机号 : 11111111111
    6. 点击注册
预期结果:
    页面左上角显示登录的用户名
"""
import unittest
from time import sleep
from Page.register_page import *
from common.databaseTool import DatabaseTool


class RegisterCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        # 连接数据库
        cls.db = DatabaseTool("168168", "ecshop_db", port=3308)

    def setUp(self):
        #     2. 打开谷歌浏览器,进入ecshop的注册页面
        self.driver = open_browser()
        self.lg = Register_page(self.driver)
        self.lg.open_url(login_url)

    def tearDown(self):
        # 关闭浏览器
        sql = "delete from ecs_users where user_name='judy%'"
        self.db.execute_one(sql)
        sql2 = "delete from ecs_users where email = '123@qq.com'"
        self.db.execute_one(sql2)
        self.lg.quit()

    @classmethod
    def tearDownClass(cls):
        # 还原数据库
        sql = "delete from ecs_users where user_name='judy'"
        cls.db.execute_one(sql)

    # 检测不输入用户名 注册失败
    def test_register_false_case01(self):
        # 用例步骤:
        # 输入用户名
        self.lg.input_username("")
        # 输入email
        self.lg.input_email("123@qq.com")
        # 输入密码
        self.lg.input_password("123456")
        # 输入确认密码
        self.lg.input_confirm_password("123456")
        # 输入qq号
        self.lg.input_qq_number("1123456")
        # 输入办公电话
        self.lg.input_office_tel("8827555")
        # 输入家庭电话
        self.lg.input_home_tel("8827666")
        # 输入手机号
        self.lg.input_extend_field5("15180600000")
        # 选择密码问题
        self.lg.question("我最喜爱的歌曲？")
        # 输入密码问题答案
        self.lg.answer("你好")
        # 点击注册
        sleep(5)
        self.lg.click_login()
        al = self.driver.switch_to.alert
        try:
            self.assertIn("用户名不能为空", al.text, msg="用例执行失败")
            al.accept()
            sql = "select user_id from ecs_users where user_name ='judy'"
            # 判断数据库内judy没有注册成功
            user_id = self.db.fetchOne(sql)
            self.assertEqual(user_id, None, msg="用例执行失败")
        except Exception as e:
            raise ("用例执行失败")

    # 检测不输入邮箱 注册失败
    def test_register_false_case02(self):
        # 用例步骤:
        # 输入用户名
        self.lg.input_username("judy")
        # 输入email
        self.lg.input_email("")
        print(self.lg.get_element_text(("id", "email_notice")))
        # 输入密码
        self.lg.input_password("123456")
        # 输入确认密码
        self.lg.input_confirm_password("123456")
        # 输入qq号
        self.lg.input_qq_number("1123456")
        # 输入办公电话
        self.lg.input_office_tel("8827555")
        # 输入家庭电话
        self.lg.input_home_tel("8827666")
        # 输入手机号
        self.lg.input_extend_field5("15180600000")
        # 选择密码问题
        self.lg.question("我最喜爱的歌曲？")
        # 输入密码问题答案
        self.lg.answer("你好")
        # 点击注册
        sleep(5)
        self.lg.click_login()
        al = self.driver.switch_to.alert
        try:
            self.assertIn("Email 为空", al.text, msg="用例执行失败")
            al.accept()
            sql = "select user_id from ecs_users where user_name ='judy'"
            # 判断数据库内judy没有注册成功
            user_id = self.db.fetchOne(sql)
            self.assertEqual(user_id, None, msg="用例执行失败")
        except Exception as e:
            raise ("用例执行失败")

    # 检测不输入密码 注册失败
    def test_register_false_case03(self):
        # 用例步骤:
        # 输入用户名
        self.lg.input_username("judy")
        # 输入email
        self.lg.input_email("123@qq.com")
        # 输入密码
        self.lg.input_password("")
        # 输入确认密码
        self.lg.input_confirm_password("123456")
        # 输入qq号
        self.lg.input_qq_number("1123456")
        # 输入办公电话
        self.lg.input_office_tel("8827555")
        # 输入家庭电话
        self.lg.input_home_tel("8827666")
        # 输入手机号
        self.lg.input_extend_field5("15180600000")
        # 选择密码问题
        self.lg.question("我最喜爱的歌曲？")
        # 输入密码问题答案
        self.lg.answer("你好")
        # 点击注册
        sleep(5)
        self.lg.click_login()
        al = self.driver.switch_to.alert
        try:
            self.assertIn("登录密码不能为空", al.text, msg="用例执行失败")
            al.accept()
            sql = "select user_id from ecs_users where user_name ='judy'"
            # 判断数据库内judy没有注册成功
            user_id = self.db.fetchOne(sql)
            self.assertEqual(user_id, None, msg="用例执行失败")
        except Exception as e:
            raise ("用例执行失败")

    # 检测不输入确认密码 注册失败
    def test_register_false_case04(self):
        # 用例步骤:
        # 输入用户名
        self.lg.input_username("judy")
        # 输入email
        self.lg.input_email("123@qq.com")
        # 输入密码
        self.lg.input_password("123456")
        # 输入确认密码
        self.lg.input_confirm_password("")
        # 输入qq号
        self.lg.input_qq_number("1123456")
        # 输入办公电话
        self.lg.input_office_tel("8827555")
        # 输入家庭电话
        self.lg.input_home_tel("8827666")
        # 输入手机号
        self.lg.input_extend_field5("15180600000")
        # 选择密码问题
        self.lg.question("我最喜爱的歌曲？")
        # 输入密码问题答案
        self.lg.answer("你好")
        # 点击注册
        sleep(5)
        self.lg.click_login()
        al = self.driver.switch_to.alert
        try:
            self.assertIn(" 两次输入密码不一致", al.text, msg="用例执行失败")
            al.accept()
            sql = "select user_id from ecs_users where user_name ='judy'"
            # 判断数据库内judy没有注册成功
            user_id = self.db.fetchOne(sql)
            self.assertEqual(user_id, None, msg="用例执行失败")
        except Exception as e:
            raise ("用例执行失败")

    # 检测不输入手机号 注册失败
    def test_register_false_case05(self):
        # 用例步骤:
        # 输入用户名
        self.lg.input_username("judy")
        # 输入email
        self.lg.input_email("123@qq.com")
        # 输入密码
        self.lg.input_password("123456")
        # 输入确认密码
        self.lg.input_confirm_password("123456")
        # 输入qq号
        self.lg.input_qq_number("1123456")
        # 输入办公电话
        self.lg.input_office_tel("8827555")
        # 输入家庭电话
        self.lg.input_home_tel("8827666")
        # 输入手机号
        self.lg.input_extend_field5("")
        # 选择密码问题
        self.lg.question("我最喜爱的歌曲？")
        # 输入密码问题答案
        self.lg.answer("你好")
        # 点击注册
        sleep(5)
        self.lg.click_login()
        al = self.driver.switch_to.alert
        try:
            self.assertIn("手机          不能为空", al.text, msg="用例执行失败")
            al.accept()
            sql = "select user_id from ecs_users where user_name ='judy'"
            # 判断数据库内judy没有注册成功
            user_id = self.db.fetchOne(sql)
            self.assertEqual(user_id, None, msg="用例执行失败")
        except Exception as e:
            raise ("用例执行失败")

    # 检测选择了密保问题 但不输入密保答案 注册失败
    # 是个bug  会报错
    def test_register_false_case06(self):
        # 用例步骤:
        # 输入用户名
        self.lg.input_username("judy")
        # 输入email
        self.lg.input_email("123@qq.com")
        # 输入密码
        self.lg.input_password("123456")
        # 输入确认密码
        self.lg.input_confirm_password("123456")
        # 输入qq号
        self.lg.input_qq_number("1123456")
        # 输入办公电话
        self.lg.input_office_tel("8827555")
        # 输入家庭电话
        self.lg.input_home_tel("8827666")
        # 输入手机号
        self.lg.input_extend_field5("15180600000")
        # 选择密码问题
        self.lg.question("我最喜爱的歌曲？")
        # 输入密码问题答案
        self.lg.answer("")
        # 点击注册
        sleep(5)
        self.lg.click_login()
        al = self.driver.switch_to.alert
        try:
            self.assertIn("请输入密保问题答案", al.text, msg="用例执行失败")
            al.accept()
            sql = "select user_id from ecs_users where user_name ='judy'"
            # 判断数据库内judy没有注册成功
            user_id = self.db.fetchOne(sql)
            self.assertEqual(user_id, None, msg="用例执行失败")
        except Exception as e:
            raise ("用例执行失败")

    # 检测确认密码和密码不一致 注册失败
    def test_register_false_case07(self):
        # 用例步骤:
        # 输入用户名
        self.lg.input_username("judy")
        # 输入email
        self.lg.input_email("123@qq.com")
        # 输入密码
        self.lg.input_password("123456")
        # 输入确认密码
        self.lg.input_confirm_password("123123")
        # 输入qq号
        self.lg.input_qq_number("1123456")
        # 输入办公电话
        self.lg.input_office_tel("8827555")
        # 输入家庭电话
        self.lg.input_home_tel("8827666")
        # 输入手机号
        self.lg.input_extend_field5("15180600000")
        # 选择密码问题
        self.lg.question("我最喜爱的歌曲？")
        # 输入密码问题答案
        self.lg.answer("你好")
        # 点击注册
        sleep(5)
        self.lg.click_login()
        al = self.driver.switch_to.alert
        try:
            self.assertIn("两次输入密码不一致", al.text, msg="用例执行失败")
            al.accept()
            sql = "select user_id from ecs_users where user_name ='judy'"
            # 判断数据库内judy没有注册成功
            user_id = self.db.fetchOne(sql)
            self.assertEqual(user_id, None, msg="用例执行失败")
        except Exception as e:
            raise ("用例执行失败")

    # 检测注册用户名为纯数字 注册失败
    # 这是一个bug 用例会失败
    def test_register_false_case08(self):
        # 用例步骤:
        # 输入用户名
        self.lg.input_username("1111111")
        # 输入email
        self.lg.input_email("123@qq.com")
        # 输入密码
        self.lg.input_password("123456")
        # 输入确认密码
        self.lg.input_confirm_password("123456")
        # 输入qq号
        self.lg.input_qq_number("1123456")
        # 输入办公电话
        self.lg.input_office_tel("8827555")
        # 输入家庭电话
        self.lg.input_home_tel("8827666")
        # 输入手机号
        self.lg.input_extend_field5("15180600000")
        # 选择密码问题
        self.lg.question("我最喜爱的歌曲？")
        # 输入密码问题答案
        self.lg.answer("你好")
        # 点击注册
        sleep(2)
        self.lg.click_login()
        al = self.driver.switch_to.alert
        try:
            self.assertIn("用户名不能为纯数字", al.text, msg="用例执行失败")
            al.accept()
            sql = "select user_id from ecs_users where user_name ='1111111'"
            # 判断数据库内judy没有注册成功
            user_id = self.db.fetchOne(sql)
            self.assertEqual(user_id, None, msg="用例执行失败")
        except Exception as e:
            raise ("用例执行失败")

    # 检测注册用户名超过7个汉字 注册失败
    # 这是一个bug 用例会失败
    def test_register_false_case09(self):
        # 用例步骤:
        # 输入用户名
        self.lg.input_username("judy超过七个汉字吗")
        # 输入email
        self.lg.input_email("123@qq.com")
        # 输入密码
        self.lg.input_password("123456")
        # 输入确认密码
        self.lg.input_confirm_password("123456")
        # 输入qq号
        self.lg.input_qq_number("1123456")
        # 输入办公电话
        self.lg.input_office_tel("8827555")
        # 输入家庭电话
        self.lg.input_home_tel("8827666")
        # 输入手机号
        self.lg.input_extend_field5("15180600000")
        # 选择密码问题
        self.lg.question("我最喜爱的歌曲？")
        # 输入密码问题答案
        self.lg.answer("你好")
        # 点击注册
        sleep(2)
        self.lg.click_login()
        try:
            sql = "select user_id from ecs_users where user_name ='judy超过七个汉字吗'"
            # 判断数据库内judy没有注册成功
            user_id = self.db.fetchOne(sql)
            self.assertEqual(user_id, None, msg="用例执行失败")
        except Exception as e:
            raise ("用例执行失败")

    # 检测注册用户名少于3个字符 注册失败
    def test_register_false_case10(self):
        # 用例步骤:
        # 输入用户名
        self.lg.input_username("ab")
        # 输入email
        self.lg.input_email("123@qq.com")
        # 输入密码
        self.lg.input_password("123456")
        # 输入确认密码
        self.lg.input_confirm_password("123456")
        # 输入qq号
        self.lg.input_qq_number("1123456")
        # 输入办公电话
        self.lg.input_office_tel("8827555")
        # 输入家庭电话
        self.lg.input_home_tel("8827666")
        # 输入手机号
        self.lg.input_extend_field5("15180600000")
        # 选择密码问题
        self.lg.question("我最喜爱的歌曲？")
        # 输入密码问题答案
        self.lg.answer("你好")
        # 点击注册
        sleep(2)
        self.lg.click_login()
        sleep(5)
        tos = self.lg.get_element_text(("xpath", "/html/body/div[5]/div/div/div/div/p[1]"))
        try:
            self.assertIn('用户名长度不能少于 3 个字符', tos, msg="用例执行失败")
            sql = "select user_id from ecs_users where user_name ='ab'"
            # 判断数据库内judy没有注册成功
            user_id = self.db.fetchOne(sql)
            self.assertEqual(user_id, None, msg="用例执行失败")
        except Exception as e:
            raise ("用例执行失败")

    # 检测取消勾选用户协议 注册失败
    def test_register_false_case11(self):
        # 用例步骤:
        # 输入用户名
        self.lg.input_username("judy")
        # 输入email
        self.lg.input_email("123@qq.com")
        # 输入密码
        self.lg.input_password("123456")
        # 输入确认密码
        self.lg.input_confirm_password("123456")
        # 输入qq号
        self.lg.input_qq_number("1123456")
        # 输入办公电话
        self.lg.input_office_tel("8827555")
        # 输入家庭电话
        self.lg.input_home_tel("8827666")
        # 输入手机号
        self.lg.input_extend_field5("15180600000")
        # 选择密码问题
        self.lg.question("我最喜爱的歌曲？")
        # 输入密码问题答案
        self.lg.answer("你好")
        # 取消勾选用户协议
        self.lg.user_agreement()
        # 点击注册
        sleep(2)
        self.lg.click_login()
        sleep(5)
        al = self.driver.switch_to.alert
        try:
            self.assertIn("您没有接受协议", al.text, msg="用例执行失败")
            al.accept()
            sql = "select user_id from ecs_users where user_name ='judy'"
            # 判断数据库内judy没有注册成功
            user_id = self.db.fetchOne(sql)
            self.assertEqual(user_id, None, msg="用例执行失败")
        except Exception as e:
            raise ("用例执行失败")

    # 检测注册使用已存在的用户名注册  注册失败
    def test_register_false_case12(self):
        # 用例步骤:
        # 输入用户名
        self.lg.input_username("lisa")
        # 输入email
        self.lg.input_email("123@qq.com")
        # 输入密码
        self.lg.input_password("123456")
        # 输入确认密码
        self.lg.input_confirm_password("123456")
        # 输入qq号
        self.lg.input_qq_number("1123456")
        # 输入办公电话
        self.lg.input_office_tel("8827555")
        # 输入家庭电话
        self.lg.input_home_tel("8827666")
        # 输入手机号
        self.lg.input_extend_field5("15180600000")
        # 选择密码问题
        self.lg.question("我最喜爱的歌曲？")
        # 输入密码问题答案
        self.lg.answer("你好")
        # 点击注册
        sleep(2)
        self.lg.click_login()
        sleep(5)
        # tos = self.lg.get_element_text(("xpath", "/html/body/div[5]/div/div/div/div/p[1]"))
        try:
            # self.assertIn('用户名lisa已存在', tos, msg="用例执行失败")
            sql = "select user_id from ecs_users where user_name ='lisa'"
            # 判断数据库内lisa没有注册成功
            user_id = self.db.fetchOne(sql)["user_id"]
            self.assertEqual(user_id, 113, msg="用例执行失败")
        except Exception as e:
            raise ("用例执行失败")

    # 检测注册使用已存在的邮箱注册 注册失败
    def test_register_false_case13(self):
        # 用例步骤:
        # 输入用户名
        self.lg.input_username("judy")
        # 输入email
        self.lg.input_email("761433409@qq.com")
        # 输入密码
        self.lg.input_password("123456")
        # 输入确认密码
        self.lg.input_confirm_password("123456")
        # 输入qq号
        self.lg.input_qq_number("1123456")
        # 输入办公电话
        self.lg.input_office_tel("8827555")
        # 输入家庭电话
        self.lg.input_home_tel("8827666")
        # 输入手机号
        self.lg.input_extend_field5("15180600000")
        # 选择密码问题
        self.lg.question("我最喜爱的歌曲？")
        # 输入密码问题答案
        self.lg.answer("你好")
        # 点击注册
        sleep(2)
        self.lg.click_login()
        sleep(5)
        try:
            sql = "select user_id from ecs_users where email ='761433409@qq.com'"
            # 判断数据库内judy没有注册成功
            user_id = self.db.fetchOne(sql)["user_id"]
            self.assertEqual(user_id, 113, msg="用例执行失败")
        except Exception as e:
            raise ("用例执行失败")

if __name__ == '__main__':
    unittest.main()
